package com.cande.loki.exercise.function;

import com.cande.loki.exercise.manythread.threadpooltest.Data;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 函数式接口
 * Function<T,R>、 参数T返回R
 * Consumer<T>、   参数T无返回
 * Predicate<T>、  参数T返回布尔
 * Supplier<T>、   参数无返回T
 */
public class TestFunction {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("1");
//consumer  在stream的.forEach（）中的使用
        testConsumer();
        testAndThen();
        list.forEach(x-> System.out.println(x.lastIndexOf(1)));
/**
 * supplier 在JDK8中Optional对象有使用到
 * Optional.orElseGet(Supplier<? extends T>) //当this对象为null，就通过传入supplier创建一个T返回。
 *
 */
        Data data = null;
        Data optional = Optional.ofNullable(data).orElseGet(Data::new);
//function  在stream的.map（）中的使用
        applyTest();
        andThenTest();
        composeTest();
        test();
        List list1 = list.stream().map(x->x.substring(1)).collect(Collectors.toList());
    }

    /**
     * 一个简单的平方计算
     */
    public static void testConsumer() {
        //设置好Consumer实现方法
        Consumer<Integer> square = x -> System.out.println("平方计算 : " + x * x);
        //传入值
        square.accept(2);
    }
    /**
     * 定义3个Consumer并按顺序进行调用andThen方法
     */
    public static void testAndThen() {
        //当前值
        Consumer<Integer> consumer1 = x -> System.out.println("当前值 : " + x);
        //相加
        Consumer<Integer> consumer2 = x -> { System.out.println("相加 : " + (x + x)); };
        //相乘
        Consumer<Integer> consumer3 = x -> System.out.println("相乘 : " + x * x);
        //andThen拼接
        consumer1.andThen(consumer2).andThen(consumer3).accept(1);
    }

    /**
     * 1、apply 示例
     */
    private static void applyTest() {
        //示例1：定义一个funciton,实现将String转换为Integer
        Function<String, Integer> function = x -> Integer.parseInt(x);
        Integer a = function.apply("100");
        System.out.println(a.getClass());
        // 结果：class java.lang.Integer
    }

    /**
     * 2、andThen 示例
     */
    private static void andThenTest() {
        //示例2：使用andThen() 实现一个函数 y=10x + 10;
        //先执行 10 * x
        Function<Integer, Integer> function2 = x -> 10 * x;
        //通过andThen在执行 这里的x就等于上面的10 * x的值
        function2 = function2.andThen(x -> x + 10);
        System.out.println(function2.apply(2));
        //结果：30

    }

    /**
     * 3、compose 示例
     */
    private static void composeTest() {
        //示例3：使用compose() 实现一个函数 y=(10+x)2;
        Function<Integer, Integer> function3 = x -> x * 2;
        //先执行 x+10 在执行(x+10)*2顺序与上面相反
        function3 = function3.compose(x -> x + 10);
        System.out.println(function3.apply(3));
        //结果：26
    }

    /**
     * 4、综合示例
     */
    private static void test() {

//示例4：使用使用compose()、andThen()实现一个函数 y=(10+x)*2+10;
        //执行第二步
        Function<Integer, Integer> function4 = x -> x * 2;
        //执行第一步
        function4 = function4.compose(x -> x + 10);
        //执行第三步
        function4 = function4.andThen(x -> x + 10);
        System.out.println(function4.apply(3));
        //结果：36

    }
}
